-- Copyright (c) 2015,2016 Lucky Byte, Inc.
--
-- Summary : 冲正交易前处理
--
-- Author  : 吴小虎 <xiaohu@lucky-byte.com>
-- Since   : 2016.8.24
--
-- History
--  * 2015.8.24 : 创建此文件，处理助农取款冲正
--

-- 通过冲正报文查询原始交易流水
-- 这是一个通用函数，适用与所有类型的冲正交易
--
local function _find_orig_record()
    local _proc_code = reqt.packet.get('3')
    local _tramt     = reqt.packet.get('4')
    local _trace_no  = reqt.packet.get('11')
    local _termid    = reqt.packet.get('41')
    local _merno     = reqt.packet.get('42')

    -- 查询时过滤掉冲正交易，这是故意的，因为这样可以允许多次冲正
    -- 隔天的交易是不允许冲正的
    local _table = jdbc.select([[
        select * from pay_trlist where sys_time::date = CURRENT_DATE and
            json_extract_path_text(trinfo, 'code') <> 't22' and
            incoming = true and
            case
            when chnl in (1,4) then
                json_extract_path_text(i_pkt, '3') = ? and
                json_extract_path_text(i_pkt, '4') = ? and
                json_extract_path_text(i_pkt, '11') = ? and
                json_extract_path_text(i_pkt, '41') = ? and
                json_extract_path_text(i_pkt, '42') = ?
            else
                false
            end
    ]], _proc_code, _tramt, _trace_no, _termid, _merno)
    if not _table or _table.count == 0 then
        notify.error('通过冲正交易[%s]未查询到原交易，请检查.', reqt.uuid)
        return nil
    end
    if _table.count > 1 then
        notify.error('通过冲正交易[%s]查询到多笔原交易，请检查.', reqt.uuid)
        return nil
    end
    return _table.get_record(0)
end


-- 助农取款冲正处理
--
local function _preproc_t22_01()
    local _orig_record = _find_orig_record()
    if not _orig_record then
        logger.error('查询冲正交易对应的原助农取款交易失败.')
        return '14'
    end

    -- 确认原交易为一笔助农取款交易
    local _trinfo = core.json.decode(_orig_record.get('trinfo'))
    if _trinfo.code ~= 't60' then
        logger.error('助农冲正交易[%s]对应的原交易[%s]非助农取款交易，不允许此冲正.',
            reqt.uuid, _orig_record.get('uuid'))
        return '08'
    end

    -- 查询助农代付订单是否已经代付，已代付的订单不允许冲正(不管代付是否成功)
    local _table = jdbc.select([[
        select * from pay_p2_order where t60_uuid = ?
    ]], _orig_record.get('uuid'))
    if _table and _table.count > 0 then
        local _order_record = _table.get_record(0)
        if _order_record.get('t40_uuid') then
            notify.warn(
                '原助农取款交易对应的代付订单[%s]已受理并已发送了代付交易，不允许冲正.',
                _order_record.get('uuid'))
            return '05'
        end

        -- 撤销代付订单，因为冲正将不再允许代付
        jdbc.update([[
            delete from pay_p2_order where uuid = ?
        ]], _order_record.get('uuid'))
    end

    -- 撤销追付记录，如果发送冲正交易延迟时间大于系统收集追付记录时间，则会有此记录
    jdbc.update([[
        delete from pay_t40_recvr where tr_uuid_1 = ?
    ]], _orig_record.get('uuid'))

    -- 更新原交易状态为2(已冲正)
    jdbc.update([[
        update pay_trlist set status = 2 where uuid = ?
    ]], _orig_record.get('uuid'))

    return '00'
end


-- 冲正交易前处理
--
local function _preproc_t22()
    logger.debug('开始执行冲正交易前处理...')

    if reqt.trinfo.subcode == '01' then -- 助农贷款冲正
        return _preproc_t22_01()
    end

    -- 未处理的冲正交易默认不允许
    logger.warn('交易[%s]没有交易前预处理，默认不允许...', reqt.trinfo.name)
    return '04'
end


return _preproc_t22
